import express from "express";
import cors from "cors";
import fs from "node:fs";
import crypto from "node:crypto";
const app = express();
app.use(cors());
app.use(express.json());
//静态资源缓存 css js png html
// app.use(express.static("static"), {
//   max: 1000 * 60 * 5, //5分钟
//   etag: true, //实体标签
//   lastModified: true, //协商缓存
// });
//强缓存---------------------------
//动态资源缓存 接口 Expires
// app.get("/api", (req, res) => {
//   res.setHeader(
//     "Expires",
//     new Date("2024-7-8 15:56:00" + 1000 * 60 * 1).toUTCString()
//   ); //1分钟过期
//   res.send("hello");
// });
//cache-control
//public 任何服务器都可以缓存 包括代理服务器 cdn
//private 只有浏览器可以缓存
//max-age=60 缓存时间 单位秒
//10s后过期，通过请求服务器设置过期时间，如果服务器没有设置过期时间，则浏览器会一直缓存
// app.get("/api2", (req, res) => {
//   res.setHeader("Cache-Control", "max-age=10");
//   res.send("Cache-Control");
// });
//Expires 和 Cache-Control同时出现，cache-control的max-age优先级高
//协商缓存---------------------------
//协商缓存 服务器和浏览器进行协商，协商成功后，浏览器会使用本地缓存
//强缓存和协商缓存同时存在，浏览器会先判断强缓存是否过期，如果未过期，直接使用本地缓存
//如何解决强缓存优先 no-cache 高速浏览器走协商缓存，不走强缓存  no-store 不走任何缓存
//last-modified 配合 if-modified-since  服务器告诉浏览器，文件最后修改时间
//ETag 配合 if-none-match 服务器告诉浏览器，文件内容是否改变
// last-modified
// const getFileModifyTime = (path = "index.js") => {
//   const stat = fs.statSync(path); //获取文件状态
//   return stat.mtime.toISOString(); //返回修改时间;
// };

// etag
const getFileHash = (path = "index.js") => {
  const data = fs.readFileSync(path); //读取文件内容
  return crypto.createHash("sha256").update(data).digest("hex"); //返回哈希值
};
app.get("/api3", (req, res) => {
  const ifModifySince = req.headers["if-modified-since"];
  const modifyTime = getFileHash();
  if (ifModifySince === modifyTime) {
    console.log("缓存了");
    res.status(304).end();
    return;
  }
  console.log("无缓存");
  res.setHeader("Cache-Control", "no-cache");
  res.setHeader("Last-Modified", modifyTime); //ETag和Last-Modified用法一样
  res.send("Cache-Control");
});
app.listen(3002, () => {
  console.log("Server started on port 3002");
});
